# 定义单链表节点类
class ListNode:
    def __init__(self, val=0, next=None):
        # 节点的值
        self.val = val
        # 指向下一个节点的指针
        self.next = next


# 定义单链表类
class LinkedList:
    def __init__(self):
        # 初始化头节点为 None
        self.head = None

    # 在链表头部插入节点
    def insert_at_head(self, val):
        new_node = ListNode(val)
        # 新节点的 next 指向原来的头节点
        new_node.next = self.head
        # 更新头节点为新节点
        self.head = new_node

    # 在链表尾部插入节点
    def insert_at_tail(self, val):
        new_node = ListNode(val)
        if not self.head:
            # 如果链表为空，新节点就是头节点
            self.head = new_node
            return
        current = self.head
        while current.next:
            # 找到链表的最后一个节点
            current = current.next
        # 最后一个节点的 next 指向新节点
        current.next = new_node

    # 删除指定值的第一个节点
    def delete_node(self, val):
        if not self.head:
            return
        if self.head.val == val:
            # 如果头节点的值等于要删除的值，更新头节点
            self.head = self.head.next
            return
        current = self.head
        while current.next and current.next.val != val:
            # 找到要删除节点的前一个节点
            current = current.next
        if current.next:
            # 如果找到要删除的节点，跳过该节点
            current.next = current.next.next

    # 查找指定值的节点
    def search(self, val):
        current = self.head
        while current:
            if current.val == val:
                return True
            current = current.next
        return False

    # 打印链表
    def display(self):
        elements = []
        current = self.head
        while current:
            elements.append(str(current.val))
            current = current.next
        print(" -> ".join(elements))


# 测试代码
if __name__ == "__main__":
    linked_list = LinkedList()
    # 在尾部插入节点
    linked_list.insert_at_tail(1)
    linked_list.insert_at_tail(2)
    linked_list.insert_at_tail(3)
    # 打印链表
    linked_list.display()  # 输出: 1 -> 2 -> 3

    # 在头部插入节点
    linked_list.insert_at_head(0)
    linked_list.display()  # 输出: 0 -> 1 -> 2 -> 3

    # 查找节点
    print(linked_list.search(2))  # 输出: True
    print(linked_list.search(4))  # 输出: False

    # 删除节点
    linked_list.delete_node(1)
    linked_list.display()  # 输出: 0 -> 2 -> 3
